package cn.qinhao.pethome.org.service.impl;


import cn.qinhao.pethome.basic.base.query.BaseQuery;
import cn.qinhao.pethome.basic.base.service.impl.BaseServiceImpl;
import cn.qinhao.pethome.basic.until.AjaxResult;
import cn.qinhao.pethome.basic.until.PageList;
import cn.qinhao.pethome.org.domain.Department;
import cn.qinhao.pethome.org.mapper.DepartmentMapper;
import cn.qinhao.pethome.org.query.DepartmentQuery;
import cn.qinhao.pethome.org.service.IDepartmentService;
import org.apache.tomcat.util.http.fileupload.util.LimitedInputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.lang.model.element.VariableElement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements IDepartmentService {
    //引入Mapper来完成具体对数据库的操作
    @Resource
    private DepartmentMapper departmentMapper;
    @Override
    public List<Department> buildTree() {

        //1、查询出全部数据
        List<Department> departments = departmentMapper.selectAll();
        //2、 查询顶级元素（多个）返回它就可以
        List<Department> roots=new ArrayList<>();
        for (Department item:departments) {
            if (item.getParent_id()==null){
                roots.add(item);
            }else{//Parent_id不为空，就表示拥有父对象，就去找父亲，找到后把自己添加到父亲存放儿子的容器sons集合中
                for (Department father:departments) {//遍历父对象，当子对象中parent_id找，相等代表找到，就添加进父对象
                    if (item.getParent_id()==father.getId()){
                        //获取装子对象的容器，然后将儿子添加到容器中
                        father.getSons().add(item);
                    }
                }
            }
        }
        //3、在数据源遍历过程中，如果一个元素不是 顶级，去找到爸爸，将其自己加入到父级的children集合。
        return roots;
    }
    /**
     * 方法2:把父对象以id为key,整个对象为value，添加到map集合中
     * 以后要用到父对象的时候就通过子对象的对应父亲的id去找到父对象，最后通过父对象获取容器，把子对象添加到容器中，返回顶级元素
     * 1.  查询出全部数据（数据源）
     *         List<Department> departments = departmentMapper.loadAll();
     * toMap(obj -> obj.getId(), obj -> obj) 有keyMapper 和 valueMapper 函数式接口， 形参是每个对象，重新mapper
     * 提供 key 和 value 的生成策略。
     *   Map<Long, Department> mapData = departments.stream(). collect(Collectors.toMap(obj->obj.getId(), obj->obj));
     * 2. 查询顶级元素（多个）返回它就可以——》没有parent_id，则表示就是顶级元素，就直接返回
*    * 3. 再数据源遍历过程中，如果一个元素不是 顶级，去找到爸爸，将其自己加入到父级的sons集合。
*    *   以当前item 的 parent_id 找对应 部门 ，
*    *   Department father = mapData.get(item.getParent_id());
*    *  把item添加到 这个父部门的集合
*    *  father.getSons().add(item);
     *  return roots;
     */
}


